* src/xend_internal.c src/xml.c: applied patch from Nobuhiro Itou

to handle CDRom devices with no device name
* tests/sexpr2xmltest.c tests/xml2sexprtest.c
  tests/sexpr2xmldata/sexpr2xml-no-source-cdrom.sexpr
  tests/sexpr2xmldata/sexpr2xml-no-source-cdrom.xml
  tests/xml2sexprdata/xml2sexpr-no-source-cdrom.sexpr
  tests/xml2sexprdata/xml2sexpr-no-source-cdrom.xml: added regression
  tests for this case based on Nobuhiro Itou test inputs.
Daniel
This commit is contained in:
Daniel Veillard 2007-04-11 16:06:30 +00:00
parent 19c6ddcce5
commit 1ec25df269
9 changed files with 267 additions and 62 deletions

View File

@ -1,3 +1,14 @@
Wed Apr 11 18:04:00 CEST 2007 Daniel Veillard <veillard@redhat.com>
* src/xend_internal.c src/xml.c: applied patch from Nobuhiro Itou
to handle CDRom devices with no device name
* tests/sexpr2xmltest.c tests/xml2sexprtest.c
tests/sexpr2xmldata/sexpr2xml-no-source-cdrom.sexpr
tests/sexpr2xmldata/sexpr2xml-no-source-cdrom.xml
tests/xml2sexprdata/xml2sexpr-no-source-cdrom.sexpr
tests/xml2sexprdata/xml2sexpr-no-source-cdrom.xml: added regression
tests for this case based on Nobuhiro Itou test inputs.
Tue Apr 10 19:17:29 EST 2007 Daniel P. Berrange <berrange@redhat.com>
* qemud/conf.c, qemu/internal.h, qemud/iptables.c, qemud/iptables.h,

View File

@ -1441,6 +1441,7 @@ xend_parse_sexp_desc(virConnectPtr conn, struct sexpr *root, int xendConfigVersi
char *offset;
int isBlock = 0;
int cdrom = 0;
int isNoSrcCdrom = 0;
char *drvName = NULL;
char *drvType = NULL;
const char *src = NULL;
@ -1458,64 +1459,75 @@ xend_parse_sexp_desc(virConnectPtr conn, struct sexpr *root, int xendConfigVersi
mode = sexpr_node(node, "device/tap/mode");
}
if (src == NULL) {
virXendError(conn, VIR_ERR_INTERNAL_ERROR,
_("domain information incomplete, vbd has no src"));
goto bad_parse;
}
if (dst == NULL) {
virXendError(conn, VIR_ERR_INTERNAL_ERROR,
_("domain information incomplete, vbd has no dev"));
goto bad_parse;
}
offset = strchr(src, ':');
if (!offset) {
virXendError(conn, VIR_ERR_INTERNAL_ERROR,
_("cannot parse vbd filename, missing driver name"));
goto bad_parse;
if (src == NULL) {
/* There is a case without the uname to the CD-ROM device */
offset = strchr(dst, ':');
if (offset) {
if (hvm && !strcmp( offset , ":cdrom")) {
isNoSrcCdrom = 1;
}
offset[0] = '\0';
}
if (!isNoSrcCdrom) {
virXendError(conn, VIR_ERR_INTERNAL_ERROR,
_("domain information incomplete, vbd has no src"));
goto bad_parse;
}
}
drvName = malloc((offset-src)+1);
if (!drvName) {
virXendError(conn, VIR_ERR_NO_MEMORY,
_("allocate new buffer"));
goto bad_parse;
}
strncpy(drvName, src, (offset-src));
drvName[offset-src] = '\0';
src = offset + 1;
if (!strcmp(drvName, "tap")) {
if (!isNoSrcCdrom) {
offset = strchr(src, ':');
if (!offset) {
virXendError(conn, VIR_ERR_INTERNAL_ERROR,
_("cannot parse vbd filename, missing driver type"));
_("cannot parse vbd filename, missing driver name"));
goto bad_parse;
}
drvType = malloc((offset-src)+1);
if (!drvType) {
drvName = malloc((offset-src)+1);
if (!drvName) {
virXendError(conn, VIR_ERR_NO_MEMORY,
_("allocate new buffer"));
goto bad_parse;
}
strncpy(drvType, src, (offset-src));
drvType[offset-src] = '\0';
strncpy(drvName, src, (offset-src));
drvName[offset-src] = '\0';
src = offset + 1;
/* Its possible to use blktap driver for block devs
too, but kinda pointless because blkback is better,
so we assume common case here. If blktap becomes
omnipotent, we can revisit this, perhaps stat()'ing
the src file in question */
isBlock = 0;
} else if (!strcmp(drvName, "phy")) {
isBlock = 1;
} else if (!strcmp(drvName, "file")) {
isBlock = 0;
if (!strcmp(drvName, "tap")) {
offset = strchr(src, ':');
if (!offset) {
virXendError(conn, VIR_ERR_INTERNAL_ERROR,
_("cannot parse vbd filename, missing driver type"));
goto bad_parse;
}
drvType = malloc((offset-src)+1);
if (!drvType) {
virXendError(conn, VIR_ERR_NO_MEMORY,
_("allocate new buffer"));
goto bad_parse;
}
strncpy(drvType, src, (offset-src));
drvType[offset-src] = '\0';
src = offset + 1;
/* Its possible to use blktap driver for block devs
too, but kinda pointless because blkback is better,
so we assume common case here. If blktap becomes
omnipotent, we can revisit this, perhaps stat()'ing
the src file in question */
isBlock = 0;
} else if (!strcmp(drvName, "phy")) {
isBlock = 1;
} else if (!strcmp(drvName, "file")) {
isBlock = 0;
}
}
if (!strncmp(dst, "ioemu:", 6))
@ -1536,18 +1548,23 @@ xend_parse_sexp_desc(virConnectPtr conn, struct sexpr *root, int xendConfigVersi
}
}
virBufferVSprintf(&buf, " <disk type='%s' device='%s'>\n",
isBlock ? "block" : "file",
cdrom ? "cdrom" : "disk");
if (drvType) {
virBufferVSprintf(&buf, " <driver name='%s' type='%s'/>\n", drvName, drvType);
if (!isNoSrcCdrom) {
virBufferVSprintf(&buf, " <disk type='%s' device='%s'>\n",
isBlock ? "block" : "file",
cdrom ? "cdrom" : "disk");
if (drvType) {
virBufferVSprintf(&buf, " <driver name='%s' type='%s'/>\n", drvName, drvType);
} else {
virBufferVSprintf(&buf, " <driver name='%s'/>\n", drvName);
}
if (isBlock) {
virBufferVSprintf(&buf, " <source dev='%s'/>\n", src);
} else {
virBufferVSprintf(&buf, " <source file='%s'/>\n", src);
}
} else {
virBufferVSprintf(&buf, " <driver name='%s'/>\n", drvName);
}
if (isBlock) {
virBufferVSprintf(&buf, " <source dev='%s'/>\n", src);
} else {
virBufferVSprintf(&buf, " <source file='%s'/>\n", src);
/* This case is the cdrom device only */
virBufferVSprintf(&buf, " <disk device='cdrom'>\n");
}
virBufferVSprintf(&buf, " <target dev='%s'/>\n", dst);

View File

@ -888,6 +888,7 @@ virDomainParseXMLDiskDesc(virConnectPtr conn, xmlNodePtr node, virBufferPtr buf,
int shareable = 0;
int typ = 0;
int cdrom = 0;
int isNoSrcCdrom = 0;
type = xmlGetProp(node, BAD_CAST "type");
if (type != NULL) {
@ -927,13 +928,23 @@ virDomainParseXMLDiskDesc(virConnectPtr conn, xmlNodePtr node, virBufferPtr buf,
}
if (source == NULL) {
virXMLError(conn, VIR_ERR_NO_SOURCE, (const char *) target, 0);
/* There is a case without the source
* to the CD-ROM device
*/
if (hvm &&
device &&
!strcmp((const char *)device, "cdrom")) {
isNoSrcCdrom = 1;
}
if (!isNoSrcCdrom) {
virXMLError(conn, VIR_ERR_NO_SOURCE, (const char *) target, 0);
if (target != NULL)
xmlFree(target);
if (device != NULL)
xmlFree(device);
return (-1);
if (target != NULL)
xmlFree(target);
if (device != NULL)
xmlFree(device);
return (-1);
}
}
if (target == NULL) {
virXMLError(conn, VIR_ERR_NO_TARGET, (const char *) source, 0);
@ -988,7 +999,7 @@ virDomainParseXMLDiskDesc(virConnectPtr conn, xmlNodePtr node, virBufferPtr buf,
} else
virBufferVSprintf(buf, "(dev '%s')", (const char *)target);
if (drvName) {
if (drvName && !isNoSrcCdrom) {
if (!strcmp((const char *)drvName, "tap")) {
virBufferVSprintf(buf, "(uname '%s:%s:%s')",
(const char *)drvName,
@ -999,7 +1010,7 @@ virDomainParseXMLDiskDesc(virConnectPtr conn, xmlNodePtr node, virBufferPtr buf,
(const char *)drvName,
(const char *)source);
}
} else {
} else if (!isNoSrcCdrom) {
if (typ == 0)
virBufferVSprintf(buf, "(uname 'file:%s')", source);
else if (typ == 1) {

View File

@ -0,0 +1,66 @@
(domain
(domid 6)
(on_crash destroy)
(memory 350)
(uuid cc2315e7-d26a-307a-438c-6d188ec4c09c)
(bootloader_args )
(name test)
(maxmem 382)
(on_reboot destroy)
(on_poweroff destroy)
(localtime 0)
(vcpus 1)
(bootloader )
(shadow_memory 4)
(cpu_weight 256)
(cpu_cap 0)
(features )
(on_xend_start ignore)
(on_xend_stop ignore)
(start_time 1175165307.38)
(cpu_time 0.956663338)
(online_vcpus 1)
(image
(hvm
(kernel /usr/lib/xen/boot/hvmloader)
(vnc 1)
(vncunused 1)
(device_model /usr/lib/xen/bin/qemu-dm)
(pae 1)
(apic 1)
(acpi 1)
(boot c)
(serial pty)
(vcpus 1)
)
)
(status 0)
(memory_dynamic_min 358)
(memory_dynamic_max 382)
(store_mfn 89598)
(device
(vif
(bridge xenbr0)
(mac 00:16:3e:0a:7b:39)
(type ioemu)
(uuid 127fee09-a0c8-c79b-4ee5-6c194efff73a)
)
)
(device
(vbd
(uname phy:/dev/sda8)
(driver paravirtualised)
(mode w)
(dev hda:disk)
(uuid df6969ad-d312-deb1-8d36-223d71e4ce95)
)
)
(device
(vbd
(driver paravirtualised)
(mode r)
(dev hdc:cdrom)
(uuid fca3aa85-1d1f-2c31-2f0b-f2dff2311f7e)
)
)
)

View File

@ -0,0 +1,36 @@
<domain type='xen' id='6'>
<name>test</name>
<uuid>cc2315e7d26a307a438c6d188ec4c09c</uuid>
<os>
<type>hvm</type>
<loader>/usr/lib/xen/boot/hvmloader</loader>
<boot dev='hd'/>
</os>
<memory>391168</memory>
<currentMemory>358400</currentMemory>
<vcpu>1</vcpu>
<on_poweroff>destroy</on_poweroff>
<on_reboot>destroy</on_reboot>
<on_crash>destroy</on_crash>
<features>
<acpi/>
<apic/>
<pae/>
</features>
<devices>
<emulator>/usr/lib/xen/bin/qemu-dm</emulator>
<interface type='ethernet'>
<mac address='00:16:3e:0a:7b:39'/>
</interface>
<disk type='block' device='disk'>
<driver name='phy'/>
<source dev='/dev/sda8'/>
<target dev='hda:disk'/>
</disk>
<disk device='cdrom'>
<target dev='hdc'/>
<readonly/>
</disk>
<graphics type='vnc' port='5906'/>
</devices>
</domain>

View File

@ -124,6 +124,12 @@ static int testCompareNetBridged(void *data ATTRIBUTE_UNUSED) {
1);
}
static int testCompareNoSourceCDRom(void *data ATTRIBUTE_UNUSED) {
return testCompareFiles("sexpr2xmldata/sexpr2xml-no-source-cdrom.xml",
"sexpr2xmldata/sexpr2xml-no-source-cdrom.sexpr",
1);
}
int
main(int argc, char **argv)
@ -189,6 +195,10 @@ main(int argc, char **argv)
1, testCompareNetBridged, NULL) != 0)
ret = -1;
if (virtTestRun("SEXPR-2-XML no source CDRom",
1, testCompareNoSourceCDRom, NULL) != 0)
ret = -1;
exit(ret==0 ? EXIT_SUCCESS : EXIT_FAILURE);
}
#else /* WITHOUT_XEN */

View File

@ -0,0 +1 @@
(vm (name 'test')(memory 350)(maxmem 382)(vcpus 1)(uuid 'cc2315e7d26a307a438c6d188ec4c09c')(on_poweroff 'destroy')(on_reboot 'destroy')(on_crash 'destroy')(image (hvm (kernel '/usr/lib/xen/boot/hvmloader')(device_model '/usr/lib/xen/bin/qemu-dm')(vcpus 1)(boot c)(acpi 1)(apic 1)(pae 1)(vnc 1)(vncdisplay 6)))(device (vbd (dev 'hda:disk:disk')(uname 'phy:/dev/sda8')(mode 'w')))(device (vbd (dev 'hdc:cdrom')(mode 'r')))(device (vif (mac '00:16:3e:0a:7b:39')(type ioemu))))

View File

@ -0,0 +1,36 @@
<domain type='xen' id='6'>
<name>test</name>
<uuid>cc2315e7d26a307a438c6d188ec4c09c</uuid>
<os>
<type>hvm</type>
<loader>/usr/lib/xen/boot/hvmloader</loader>
<boot dev='hd'/>
</os>
<memory>391168</memory>
<currentMemory>358400</currentMemory>
<vcpu>1</vcpu>
<on_poweroff>destroy</on_poweroff>
<on_reboot>destroy</on_reboot>
<on_crash>destroy</on_crash>
<features>
<acpi/>
<apic/>
<pae/>
</features>
<devices>
<emulator>/usr/lib/xen/bin/qemu-dm</emulator>
<interface type='ethernet'>
<mac address='00:16:3e:0a:7b:39'/>
</interface>
<disk type='block' device='disk'>
<driver name='phy'/>
<source dev='/dev/sda8'/>
<target dev='hda:disk'/>
</disk>
<disk device='cdrom'>
<target dev='hdc'/>
<readonly/>
</disk>
<graphics type='vnc' port='5906'/>
</devices>
</domain>

View File

@ -1,6 +1,9 @@
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <fcntl.h>
#include "xml.h"
#include "testutils.h"
#include "internal.h"
@ -31,11 +34,14 @@ static int testCompareFiles(const char *xml, const char *sexpr, const char *name
printf("Expect %d '%s'\n", (int)strlen(sexprData), sexprData);
printf("Actual %d '%s'\n", (int)strlen(gotsexpr), gotsexpr);
}
if (strcmp(sexprData, gotsexpr))
goto fail;
if (strcmp(sexprData, gotsexpr)) {
goto fail;
}
if (strcmp(name, gotname))
goto fail;
if (strcmp(name, gotname)) {
printf("Got wrong name: expected %s, got %s\n", name, gotname);
goto fail;
}
ret = 0;
@ -167,6 +173,13 @@ static int testCompareNetBridged(void *data ATTRIBUTE_UNUSED) {
2);
}
static int testCompareNoSourceCDRom(void *data ATTRIBUTE_UNUSED) {
return testCompareFiles("xml2sexprdata/xml2sexpr-no-source-cdrom.xml",
"xml2sexprdata/xml2sexpr-no-source-cdrom.sexpr",
"test",
2);
}
int
main(int argc, char **argv)
@ -248,5 +261,9 @@ main(int argc, char **argv)
1, testCompareNetBridged, NULL) != 0)
ret = -1;
if (virtTestRun("XML-2-SEXPR No Source CDRom",
1, testCompareNoSourceCDRom, NULL) != 0)
ret = -1;
exit(ret==0 ? EXIT_SUCCESS : EXIT_FAILURE);
}