2011/7/12 [email protected] <[email protected]> > ** > Hello, > > So what I see from the discussion is that I have to reimplement my patch > one way or another (attribute / sub-element). So I am eager to do that as > soon as the choice is made (unless you decide otherwise and want someone > else to implement that). >
Oh, I already went ahead and implemented a first version of this (3 days ago) while thinking about how this could integrate with Eric's checkpointing, but didn't post it yet. It's a bit incomplete and lacks documentation, support for the legacy modes is incomplete and test coverage is incomplete. Here's the preliminary patch. > Now that you have explained the bigger picture with more details (other > hypervisors but the ESX) let me summarize an upcoming changes into a > specification: > Value in .vmx file > representation in <domain> XML" as attributes > representation in <domain> XML" as sub-items Description > scsi0:0.mode = "persistent" <disk ... snapshot='yes' persistent='yes'> > > Default. Snapshots are in use, changes survive power cycles > scsi0:0.mode = "independent-persistent" <disk ... snapshot='no' > persistent='yes'> <independent/> No snapshot logic is applicable, changes > remain > scsi0:0.mode = "independent-nonpersistent" <disk ... snapshot='no' > persistent='no'> <independent/> <nonpersistent/> No snapshots, changes > lost after domain power cycles > scsi0:0.mode = "undoable" <disk ... snapshot='no' persistent='yes'> > <independent/> for backwards compatibility scsi0:0.mode = "nonpersistent" > <disk > ... snapshot='no' persistent='no'> <independent/> <nonpersistent/> for > backwards compatibility > Also the reverse conversion has to be implemented (<domain> XML -> vmx > file). > > Obviously the appropriate <domain> XML format description changes has to be > made here: http://libvirt.org/formatdomain.html#elementsDisks. I can do > that as well. > > Best regards > Oleh Paliy > > > > On 07/09/2011 09:52 AM, Matthias Bolte wrote: > > Anyway, you decided to add an snapshot_mode attribute to the disk > element and exposed the VMX values there. I'm not sure that this is a > good idea as scsi0:0.mode affects two aspects. > > scsi0:0.mode can basically have three different modes > > - persistent, the default, a disk with this mode will take part in > snapshots and changes to the disk's content persist domain power > cycles and snapshot restoring. > > - independent-persistent, a disk with this mode will not take part in > snapshots, but changes to the disk's content persist domain power > cycles and snapshot restoring. > > - independent-nonpersistent, a disk with this mode will be not take > part in snapshots and changes to the disk's content don't persist > domain power cycles and snapshot restoring. This is realized by > writing all changes into an additional .vmdk instead of the original > .vmdk. This additional .vmdk is automatically deleted on domain power > cycles and snapshot restoring. > > There are two additional but outdated modes undoable and nonpersistent > that aren't supported anymore. > > So the two aspects scsi0:0.mode affects is snapshot and the > persistence of changes. I think it makes more sense to use two > attributes for the disk element to expose this. > > <disk ... snapshot='yes|no' persistent='yes|no'> > > - snapshot=yes persistent=yes maps to scsi0:0.mode=persistent > > - snapshot=yes persistent=no is unsupported for ESX > > - snapshot=no persistent=yes maps to scsi0:0.mode=independent-persistent > > - snapshot=no persistent=no maps to scsi0:0.mode=independent-nonpersistent > > Hmm, this indeed seems like it might be reasonable to represent both > aspects in XML. See > alsohttps://www.redhat.com/archives/libvir-list/2011-May/msg00315.html. > > At stake is whether a disk has a snapshot taken by default, and whether > a disk is treated as temporary for the life of the domain (qemu has a > -snapshot command line option that treats all disks as temporary, but > with better per-volume snapshot abilities, libvirt could certainly offer > the same fine-tuning of per-disk as esx appears to offer). > > So yes, I'll need to fold something like this into my v2 proposal for > snapshot handling. > > > The more important question is: Is this an general concept or is it > too ESX specific? > > It's sounding generic enough that it will be worth getting it right in > the XML. > > > Eric is currently discussing/designing an extension to libvirt's > snapshot/checkpoint capabilities. At the moment libvirt supports > checkpointing a complete domain including RAM image and all storage > volumes, but it doesn't support snapshotting of single storage volumes > or a subset of the storage volumes of a domain. > https://www.redhat.com/archives/libvir-list/2011-June/msg00761.html > > Eric suggest to extend the <domainsnapshot> and virStorageVol* APIs to > allow to include only a subset of the domain's storage volumes in a > checkpoint. This approach allows to specifiy for each checkpoint which > storage volumes to include. ESX allows something similar with the > independent modes, but you cannot define this on a per snapshot basis, > but have to decided this before. Eric's approach is more flexible but > doesn't work for ESX. I wonder if we could add the snapshot > attribute/subelement to the disk element. This allows to set the > independent mode for ESX and allows to define a preset for other > hypervisors like QEMU that will support Eric's more flexible approach. > > So when you don't explicitly define which disk to include in a > checkpoint in the <domainsnapshot> XML then the snapshot setting from > the the <domain> XML apply. If there are no presets for snapshot it > defaults to yes. For QEMU you could override the snapshot setting from > the <domain> XML in the <domainsnapshot> XML, for ESX you either don't > specify this in the <domainsnapshot> XML or have to match the settings > from the <domain> XML due to the way ESX works. > > Yes, having a per-disk default in the <domain> XML (applicable to both > qemu and ESX), as well as a per-disk override in the <domainsnapshot> > (here, qemu can take advantage, but ESX would have to fail if the > override is not identical to the domain defaults). does make sense. > > > The persistence setting might be more ESX specific, but I think > libvirt could realize this for QEMU too, when the domain is using > qcow2 images with a base image. In that case libvirt could clear the > qcow2 image when the domain is restarted to realize persistent=no. I > might be incorrect here as I'm not the QEMU expert here. > > You're exactly right - qemu can implement per-disk persistent=no by > doing a qcow2 wrapper around just the disks that should be reverted when > the VM stops running. There might be some interactions with migration > to worry about, though. > > > On a second thought we might want to use negative word so we don't add > subelements for the defaults, for example > > <disk type='file' device='disk'> > <source file='[datastore] test1/test1.vmdk'/> > <target dev='sda' bus='scsi'/> > <independent/> > <nonpersistent/> > <address type='drive' controller='0' bus='0' unit='0'/> > </disk> > > Now we're doing a bit of bike-shedding - I think there's definitely > consensus that this has to be in the XML somewhere, but whether as an > attribute or as a sub-element still remains to be decided. > > > > > -- > libvir-list mailing list > [email protected] > https://www.redhat.com/mailman/listinfo/libvir-list > -- Matthias Bolte http://photron.blogspot.com
From 8247ae0539b9e13c3b9537a8a9c8fd7bbba98d77 Mon Sep 17 00:00:00 2001 From: Matthias Bolte <[email protected]> Date: Sat, 9 Jul 2011 16:16:45 +0200 Subject: [PATCH] vmx: Add snapshot preset and persistent options for disks Suggested by Oleh Paliy. --- docs/schemas/domain.rng | 10 +++ src/conf/domain_conf.c | 10 +++ src/conf/domain_conf.h | 2 + src/vmx/vmx.c | 89 ++++++++++++++++++----- tests/vmx2xmldata/vmx2xml-esx-in-the-wild-7.vmx | 63 ++++++++++++++++ tests/vmx2xmldata/vmx2xml-esx-in-the-wild-7.xml | 51 +++++++++++++ tests/vmx2xmldata/vmx2xml-gsx-in-the-wild-1.xml | 1 + tests/vmx2xmldata/vmx2xml-gsx-in-the-wild-2.xml | 1 + tests/vmx2xmldata/vmx2xml-gsx-in-the-wild-3.xml | 1 + tests/vmx2xmldata/vmx2xml-gsx-in-the-wild-4.xml | 1 + tests/vmx2xmltest.c | 1 + tests/xml2vmxdata/xml2vmx-esx-in-the-wild-7.vmx | 34 +++++++++ tests/xml2vmxdata/xml2vmx-esx-in-the-wild-7.xml | 51 +++++++++++++ tests/xml2vmxtest.c | 1 + 14 files changed, 297 insertions(+), 19 deletions(-) create mode 100644 tests/vmx2xmldata/vmx2xml-esx-in-the-wild-7.vmx create mode 100644 tests/vmx2xmldata/vmx2xml-esx-in-the-wild-7.xml create mode 100644 tests/xml2vmxdata/xml2vmx-esx-in-the-wild-7.vmx create mode 100644 tests/xml2vmxdata/xml2vmx-esx-in-the-wild-7.xml diff --git a/docs/schemas/domain.rng b/docs/schemas/domain.rng index 8a4e3fe..d73c2fd 100644 --- a/docs/schemas/domain.rng +++ b/docs/schemas/domain.rng @@ -610,6 +610,16 @@ </element> </optional> <optional> + <element name="independent"> + <empty/> + </element> + </optional> + <optional> + <element name="nonpersistent"> + <empty/> + </element> + </optional> + <optional> <element name="serial"> <ref name="diskSerial"/> </element> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index bf2eadf..356619a 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -2150,6 +2150,10 @@ virDomainDiskDefParseXML(virCapsPtr caps, def->readonly = 1; } else if (xmlStrEqual(cur->name, BAD_CAST "shareable")) { def->shared = 1; + } else if (xmlStrEqual(cur->name, BAD_CAST "independent")) { + def->independent = 1; + } else if (xmlStrEqual(cur->name, BAD_CAST "nonpersistent")) { + def->nonpersistent = 1; } else if ((flags & VIR_DOMAIN_XML_INTERNAL_STATUS) && xmlStrEqual(cur->name, BAD_CAST "state")) { /* Legacy back-compat. Don't add any more attributes here */ @@ -7182,6 +7186,8 @@ static bool virDomainDiskDefCheckABIStability(virDomainDiskDefPtr src, goto cleanup; } + /* FIXME: do we need to check independent and nonpersistent here too? */ + if (!virDomainDeviceInfoCheckABIStability(&src->info, &dst->info)) goto cleanup; @@ -8579,6 +8585,10 @@ virDomainDiskDefFormat(virBufferPtr buf, virBufferAddLit(buf, " <readonly/>\n"); if (def->shared) virBufferAddLit(buf, " <shareable/>\n"); + if (def->independent) + virBufferAddLit(buf, " <independent/>\n"); + if (def->nonpersistent) + virBufferAddLit(buf, " <nonpersistent/>\n"); if (def->serial) virBufferEscapeString(buf, " <serial>%s</serial>\n", def->serial); diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 8262d25..bcfc2ac 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -236,6 +236,8 @@ struct _virDomainDiskDef { int ioeventfd; unsigned int readonly : 1; unsigned int shared : 1; + unsigned int independent : 1; + unsigned int nonpersistent : 1; virDomainDeviceInfo info; virStorageEncryptionPtr encryption; }; diff --git a/src/vmx/vmx.c b/src/vmx/vmx.c index b37f03b..cd436cd 100644 --- a/src/vmx/vmx.c +++ b/src/vmx/vmx.c @@ -97,11 +97,6 @@ def->disks[0]... scsi0:0.present = "true" # defaults to "false" scsi0:0.startConnected = "true" # defaults to "true" -??? <=> scsi0:0.mode = "persistent" # defaults to "persistent" - scsi0:0.mode = "undoable" - scsi0:0.mode = "independent-persistent" - scsi0:0.mode = "independent-nonpersistent" - ... ->type = _DISK_TYPE_FILE <=> scsi0:0.deviceType = "scsi-hardDisk" # defaults to ? ->device = _DISK_DEVICE_DISK <=> scsi0:0.deviceType = "scsi-hardDisk" # defaults to ? @@ -113,7 +108,11 @@ def->disks[0]... ->cachemode <=> scsi0:0.writeThrough = "<value>" # defaults to false, true -> _DISK_CACHE_WRITETHRU, false _DISK_CACHE_DEFAULT ->readonly ->shared -->slotnum +->independent <=> scsi0:0.mode = "persistent" # defaults to "persistent" +->nonpersistent scsi0:0.mode = "independent-persistent" + scsi0:0.mode = "independent-nonpersistent" + scsi0:0.mode = "undoable" # legacy + scsi0:0.mode = "nonpersistent" # legacy ## disks: ide hard drive from .vmdk image ###################################### @@ -121,11 +120,6 @@ def->disks[0]... ide0:0.present = "true" # defaults to "false" ide0:0.startConnected = "true" # defaults to "true" -??? <=> ide0:0.mode = "persistent" # defaults to "persistent" - ide0:0.mode = "undoable" - ide0:0.mode = "independent-persistent" - ide0:0.mode = "independent-nonpersistent" - ... ->type = _DISK_TYPE_FILE <=> ide0:0.deviceType = "ata-hardDisk" # defaults to ? ->device = _DISK_DEVICE_DISK <=> ide0:0.deviceType = "ata-hardDisk" # defaults to ? @@ -137,7 +131,11 @@ def->disks[0]... ->cachemode <=> ide0:0.writeThrough = "<value>" # defaults to false, true -> _DISK_CACHE_WRITETHRU, false _DISK_CACHE_DEFAULT ->readonly ->shared -->slotnum +->independent <=> ide0:0.mode = "persistent" # defaults to "persistent" +->nonpersistent ide0:0.mode = "independent-persistent" + ide0:0.mode = "independent-nonpersistent" + ide0:0.mode = "undoable" # legacy + ide0:0.mode = "nonpersistent" # legacy ## disks: scsi cdrom from .iso image ########################################### @@ -157,7 +155,8 @@ def->disks[0]... ->cachemode ->readonly ->shared -->slotnum +->independent +->nonpersistent ## disks: ide cdrom from .iso image ############################################ @@ -176,7 +175,8 @@ def->disks[0]... ->cachemode ->readonly ->shared -->slotnum +->independent +->nonpersistent ## disks: scsi cdrom from host device ########################################## @@ -196,7 +196,8 @@ def->disks[0]... ->cachemode ->readonly ->shared -->slotnum +->independent +->nonpersistent ## disks: ide cdrom from host device ########################################### @@ -216,7 +217,8 @@ def->disks[0]... ->cachemode ->readonly ->shared -->slotnum +->independent +->nonpersistent ## disks: floppy from .flp image ############################################### @@ -236,7 +238,8 @@ def->disks[0]... ->cachemode ->readonly ->shared -->slotnum +->independent +->nonpersistent ## disks: floppy from host device ############################################## @@ -256,7 +259,8 @@ def->disks[0]... ->cachemode ->readonly ->shared -->slotnum +->independent +->nonpersistent @@ -1932,6 +1936,9 @@ virVMXParseDisk(virVMXContext *ctx, virCapsPtr caps, virConfPtr conf, char writeThrough_name[32] = ""; bool writeThrough = false; + char mode_name[32] = ""; + char *mode = NULL; + if (def == NULL || *def != NULL) { VMX_ERROR(VIR_ERR_INTERNAL_ERROR, "%s", _("Invalid argument")); return -1; @@ -2053,6 +2060,7 @@ virVMXParseDisk(virVMXContext *ctx, virCapsPtr caps, virConfPtr conf, VMX_BUILD_NAME(fileType); VMX_BUILD_NAME(fileName); VMX_BUILD_NAME(writeThrough); + VMX_BUILD_NAME(mode); /* vmx:present */ if (virVMXGetConfigBoolean(conf, present_name, &present, false, true) < 0) { @@ -2105,6 +2113,11 @@ virVMXParseDisk(virVMXContext *ctx, virCapsPtr caps, virConfPtr conf, goto cleanup; } + /* vmx:mode -> def:independent, def:nonpersistent */ + if (virVMXGetConfigString(conf, mode_name, &mode, true) < 0) { + goto cleanup; + } + /* Setup virDomainDiskDef */ if (device == VIR_DOMAIN_DISK_DEVICE_DISK) { if (virFileHasSuffix(fileName, ".vmdk")) { @@ -2130,10 +2143,29 @@ virVMXParseDisk(virVMXContext *ctx, virCapsPtr caps, virConfPtr conf, (*def)->type = VIR_DOMAIN_DISK_TYPE_FILE; (*def)->src = ctx->parseFileName(fileName, ctx->opaque); + + if ((*def)->src == NULL) { + goto cleanup; + } + (*def)->cachemode = writeThrough ? VIR_DOMAIN_DISK_CACHE_WRITETHRU : VIR_DOMAIN_DISK_CACHE_DEFAULT; - if ((*def)->src == NULL) { + if (mode == NULL || STRCASEEQ(mode, "persistent")) { + (*def)->independent = 0; + (*def)->nonpersistent = 0; + } else if (STRCASEEQ(mode, "independent-persistent") || + STRCASEEQ(mode, "undoable")) { + (*def)->independent = 1; + (*def)->nonpersistent = 0; + } else if (STRCASEEQ(mode, "independent-nonpersistent") || + STRCASEEQ(mode, "nonpersistent")) { + (*def)->independent = 1; + (*def)->nonpersistent = 1; + } else { + VMX_ERROR(VIR_ERR_INTERNAL_ERROR, + _("Invalid or not yet handled value '%s' for VMX " + "entry '%s'"), mode, mode_name); goto cleanup; } } else if (virFileHasSuffix(fileName, ".iso") || @@ -3310,6 +3342,7 @@ virVMXFormatHardDisk(virVMXContext *ctx, virDomainDiskDefPtr def, } if (def->bus == VIR_DOMAIN_DISK_BUS_SCSI) { + /* def:cachemode -> vmx:writeThrough */ if (def->cachemode == VIR_DOMAIN_DISK_CACHE_WRITETHRU) { virBufferAsprintf(buffer, "%s%d:%d.writeThrough = \"true\"\n", entryPrefix, controllerOrBus, unit); @@ -3322,6 +3355,24 @@ virVMXFormatHardDisk(virVMXContext *ctx, virDomainDiskDefPtr def, } } + /* def:independent, def:nonpersistent -> vmx:mode */ + /* FIXME: might need to output undoable and nonpersistent here too */ + if (def->independent == 0 && def->nonpersistent == 0) { + /* persistent is the default, don't output it */ + } else if (def->independent == 1 && def->nonpersistent == 0) { + virBufferAsprintf(buffer, "%s%d:%d.mode = \"independent-persistent\"\n", + entryPrefix, controllerOrBus, unit); + } else if (def->independent == 1 && def->nonpersistent == 1) { + virBufferAsprintf(buffer, "%s%d:%d.mode = \"independent-nonpersistent\"\n", + entryPrefix, controllerOrBus, unit); + } else { + VMX_ERROR(VIR_ERR_CONFIG_UNSUPPORTED, + _("%s harddisk '%s' has unsupported " + "independent/nonpersistent combination"), + busName, def->dst); + return -1; + } + return 0; } diff --git a/tests/vmx2xmldata/vmx2xml-esx-in-the-wild-7.vmx b/tests/vmx2xmldata/vmx2xml-esx-in-the-wild-7.vmx new file mode 100644 index 0000000..4846df1 --- /dev/null +++ b/tests/vmx2xmldata/vmx2xml-esx-in-the-wild-7.vmx @@ -0,0 +1,63 @@ +#!/usr/bin/vmware +.encoding = "UTF-8" +config.version = "8" +virtualHW.version = "4" +nvram = "testvm.nvram" +virtualHW.productCompatibility = "hosted" +powerType.powerOff = "soft" +powerType.powerOn = "hard" +powerType.suspend = "hard" +powerType.reset = "soft" +displayName = "testvm" +extendedConfigFile = "testvm.vmxf" +scsi0.present = "TRUE" +scsi0.sharedBus = "none" +scsi0.virtualDev = "lsilogic" +memsize = "256" +scsi0:0.present = "TRUE" +scsi0:0.fileName = "testvm.vmdk" +scsi0:0.deviceType = "scsi-hardDisk" +ide0:0.present = "TRUE" +ide0:0.fileName = "CD-ROM 1" +ide0:0.deviceType = "atapi-cdrom" +ide0:0.startConnected = "FALSE" +ethernet0.present = "TRUE" +ethernet0.wakeOnPcktRcv = "FALSE" +ethernet0.networkName = "VM Network" +ethernet0.addressType = "generated" +guestOS = "linux" +uuid.location = "56 4d 27 3f 39 75 42 d5-82 7b d5 37 50 90 f1 f0" +uuid.bios = "56 4d 27 3f 39 75 42 d5-82 7b d5 37 50 90 f1 f0" +vc.uuid = "52 18 27 61 7f 30 e8 eb-e7 47 3e 82 9e c8 e1 88" +sched.cpu.min = "0" +sched.cpu.units = "mhz" +sched.cpu.shares = "normal" +sched.mem.minsize = "0" +sched.mem.shares = "normal" +ethernet0.generatedAddress = "00:0c:29:90:f1:f0" +cleanShutdown = "TRUE" +replay.supported = "FALSE" +sched.swap.derivedName = "/vmfs/volumes/4d515963-ef9b0cde-15f7-001517fa90d1/testvm/testvm-b2877b1f.vswp" +replay.filename = "" +scsi0:0.redo = "" +vmotion.checkpointFBSize = "4194304" +ethernet0.generatedAddressOffset = "0" +hostCPUID.0 = "0000000b756e65476c65746e49656e69" +hostCPUID.1 = "000206c200200800029ee3ffbfebfbff" +hostCPUID.80000001 = "0000000000000000000000012c100800" +guestCPUID.0 = "0000000b756e65476c65746e49656e69" +guestCPUID.1 = "000206c200010800029822030febfbff" +guestCPUID.80000001 = "00000000000000000000000128100800" +userCPUID.0 = "0000000b756e65476c65746e49656e69" +userCPUID.1 = "000206c200200800029822030febfbff" +userCPUID.80000001 = "00000000000000000000000128100800" +evcCompatibilityMode = "FALSE" +scsi0:1.present = "TRUE" +scsi0:1.fileName = "testvm_1.vmdk" +scsi0:1.mode = "independent-persistent" +scsi0:1.deviceType = "scsi-hardDisk" +scsi0:2.present = "TRUE" +scsi0:2.fileName = "testvm_2.vmdk" +scsi0:2.mode = "independent-nonpersistent" +scsi0:2.deviceType = "scsi-hardDisk" +floppy0.present = "FALSE" diff --git a/tests/vmx2xmldata/vmx2xml-esx-in-the-wild-7.xml b/tests/vmx2xmldata/vmx2xml-esx-in-the-wild-7.xml new file mode 100644 index 0000000..7432ff5 --- /dev/null +++ b/tests/vmx2xmldata/vmx2xml-esx-in-the-wild-7.xml @@ -0,0 +1,51 @@ +<domain type='vmware'> + <name>testvm</name> + <uuid>564d273f-3975-42d5-827b-d5375090f1f0</uuid> + <memory>262144</memory> + <currentMemory>262144</currentMemory> + <vcpu>1</vcpu> + <cputune> + <shares>1000</shares> + </cputune> + <os> + <type arch='i686'>hvm</type> + </os> + <clock offset='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>destroy</on_crash> + <devices> + <disk type='file' device='disk'> + <source file='[datastore] directory/testvm.vmdk'/> + <target dev='sda' bus='scsi'/> + <address type='drive' controller='0' bus='0' unit='0'/> + </disk> + <disk type='file' device='disk'> + <source file='[datastore] directory/testvm_1.vmdk'/> + <target dev='sdb' bus='scsi'/> + <independent/> + <address type='drive' controller='0' bus='0' unit='1'/> + </disk> + <disk type='file' device='disk'> + <source file='[datastore] directory/testvm_2.vmdk'/> + <target dev='sdc' bus='scsi'/> + <independent/> + <nonpersistent/> + <address type='drive' controller='0' bus='0' unit='2'/> + </disk> + <disk type='block' device='cdrom'> + <source dev='CD-ROM 1'/> + <target dev='hda' bus='ide'/> + <address type='drive' controller='0' bus='0' unit='0'/> + </disk> + <controller type='scsi' index='0' model='lsilogic'/> + <controller type='ide' index='0'/> + <interface type='bridge'> + <mac address='00:0c:29:90:f1:f0'/> + <source bridge='VM Network'/> + </interface> + <video> + <model type='vmvga' vram='4096'/> + </video> + </devices> +</domain> diff --git a/tests/vmx2xmldata/vmx2xml-gsx-in-the-wild-1.xml b/tests/vmx2xmldata/vmx2xml-gsx-in-the-wild-1.xml index b572ad1..acc8abf 100644 --- a/tests/vmx2xmldata/vmx2xml-gsx-in-the-wild-1.xml +++ b/tests/vmx2xmldata/vmx2xml-gsx-in-the-wild-1.xml @@ -15,6 +15,7 @@ <disk type='file' device='disk'> <source file='[datastore] directory/Debian-System1-0-cl2.vmdk'/> <target dev='hda' bus='ide'/> + <independent/> <address type='drive' controller='0' bus='0' unit='0'/> </disk> <controller type='ide' index='0'/> diff --git a/tests/vmx2xmldata/vmx2xml-gsx-in-the-wild-2.xml b/tests/vmx2xmldata/vmx2xml-gsx-in-the-wild-2.xml index 180cf68..9058d06 100644 --- a/tests/vmx2xmldata/vmx2xml-gsx-in-the-wild-2.xml +++ b/tests/vmx2xmldata/vmx2xml-gsx-in-the-wild-2.xml @@ -15,6 +15,7 @@ <disk type='file' device='disk'> <source file='[datastore] directory/Debian-System1-0-cl3.vmdk'/> <target dev='hda' bus='ide'/> + <independent/> <address type='drive' controller='0' bus='0' unit='0'/> </disk> <controller type='ide' index='0'/> diff --git a/tests/vmx2xmldata/vmx2xml-gsx-in-the-wild-3.xml b/tests/vmx2xmldata/vmx2xml-gsx-in-the-wild-3.xml index 571c83a..8b0ac85 100644 --- a/tests/vmx2xmldata/vmx2xml-gsx-in-the-wild-3.xml +++ b/tests/vmx2xmldata/vmx2xml-gsx-in-the-wild-3.xml @@ -15,6 +15,7 @@ <disk type='file' device='disk'> <source file='[datastore] directory/Debian-System1-0-cl1.vmdk'/> <target dev='hda' bus='ide'/> + <independent/> <address type='drive' controller='0' bus='0' unit='0'/> </disk> <controller type='ide' index='0'/> diff --git a/tests/vmx2xmldata/vmx2xml-gsx-in-the-wild-4.xml b/tests/vmx2xmldata/vmx2xml-gsx-in-the-wild-4.xml index fc3b966..a9a9522 100644 --- a/tests/vmx2xmldata/vmx2xml-gsx-in-the-wild-4.xml +++ b/tests/vmx2xmldata/vmx2xml-gsx-in-the-wild-4.xml @@ -15,6 +15,7 @@ <disk type='file' device='disk'> <source file='[datastore] directory/Debian-System1-0-cl2.vmdk'/> <target dev='hda' bus='ide'/> + <independent/> <address type='drive' controller='0' bus='0' unit='0'/> </disk> <controller type='ide' index='0'/> diff --git a/tests/vmx2xmltest.c b/tests/vmx2xmltest.c index 92dc7d4..5ae934b 100644 --- a/tests/vmx2xmltest.c +++ b/tests/vmx2xmltest.c @@ -262,6 +262,7 @@ mymain(void) DO_TEST("esx-in-the-wild-4", "esx-in-the-wild-4"); DO_TEST("esx-in-the-wild-5", "esx-in-the-wild-5"); DO_TEST("esx-in-the-wild-6", "esx-in-the-wild-6"); + DO_TEST("esx-in-the-wild-7", "esx-in-the-wild-7"); DO_TEST("gsx-in-the-wild-1", "gsx-in-the-wild-1"); DO_TEST("gsx-in-the-wild-2", "gsx-in-the-wild-2"); diff --git a/tests/xml2vmxdata/xml2vmx-esx-in-the-wild-7.vmx b/tests/xml2vmxdata/xml2vmx-esx-in-the-wild-7.vmx new file mode 100644 index 0000000..999b0ee --- /dev/null +++ b/tests/xml2vmxdata/xml2vmx-esx-in-the-wild-7.vmx @@ -0,0 +1,34 @@ +.encoding = "UTF-8" +config.version = "8" +virtualHW.version = "4" +guestOS = "other" +uuid.bios = "56 4d 27 3f 39 75 42 d5-82 7b d5 37 50 90 f1 f0" +displayName = "testvm" +memsize = "256" +numvcpus = "1" +sched.cpu.shares = "normal" +scsi0.present = "true" +scsi0.virtualDev = "lsilogic" +scsi0:0.present = "true" +scsi0:0.deviceType = "scsi-hardDisk" +scsi0:0.fileName = "/vmfs/volumes/datastore/directory/testvm.vmdk" +scsi0:1.present = "true" +scsi0:1.deviceType = "scsi-hardDisk" +scsi0:1.fileName = "/vmfs/volumes/datastore/directory/testvm_1.vmdk" +scsi0:1.mode = "independent-persistent" +scsi0:2.present = "true" +scsi0:2.deviceType = "scsi-hardDisk" +scsi0:2.fileName = "/vmfs/volumes/datastore/directory/testvm_2.vmdk" +scsi0:2.mode = "independent-nonpersistent" +ide0:0.present = "true" +ide0:0.deviceType = "atapi-cdrom" +ide0:0.fileName = "CD-ROM 1" +floppy0.present = "false" +floppy1.present = "false" +ethernet0.present = "true" +ethernet0.networkName = "VM Network" +ethernet0.connectionType = "bridged" +ethernet0.addressType = "generated" +ethernet0.generatedAddress = "00:0C:29:90:F1:F0" +ethernet0.generatedAddressOffset = "0" +svga.vramSize = "4194304" diff --git a/tests/xml2vmxdata/xml2vmx-esx-in-the-wild-7.xml b/tests/xml2vmxdata/xml2vmx-esx-in-the-wild-7.xml new file mode 100644 index 0000000..7432ff5 --- /dev/null +++ b/tests/xml2vmxdata/xml2vmx-esx-in-the-wild-7.xml @@ -0,0 +1,51 @@ +<domain type='vmware'> + <name>testvm</name> + <uuid>564d273f-3975-42d5-827b-d5375090f1f0</uuid> + <memory>262144</memory> + <currentMemory>262144</currentMemory> + <vcpu>1</vcpu> + <cputune> + <shares>1000</shares> + </cputune> + <os> + <type arch='i686'>hvm</type> + </os> + <clock offset='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>destroy</on_crash> + <devices> + <disk type='file' device='disk'> + <source file='[datastore] directory/testvm.vmdk'/> + <target dev='sda' bus='scsi'/> + <address type='drive' controller='0' bus='0' unit='0'/> + </disk> + <disk type='file' device='disk'> + <source file='[datastore] directory/testvm_1.vmdk'/> + <target dev='sdb' bus='scsi'/> + <independent/> + <address type='drive' controller='0' bus='0' unit='1'/> + </disk> + <disk type='file' device='disk'> + <source file='[datastore] directory/testvm_2.vmdk'/> + <target dev='sdc' bus='scsi'/> + <independent/> + <nonpersistent/> + <address type='drive' controller='0' bus='0' unit='2'/> + </disk> + <disk type='block' device='cdrom'> + <source dev='CD-ROM 1'/> + <target dev='hda' bus='ide'/> + <address type='drive' controller='0' bus='0' unit='0'/> + </disk> + <controller type='scsi' index='0' model='lsilogic'/> + <controller type='ide' index='0'/> + <interface type='bridge'> + <mac address='00:0c:29:90:f1:f0'/> + <source bridge='VM Network'/> + </interface> + <video> + <model type='vmvga' vram='4096'/> + </video> + </devices> +</domain> diff --git a/tests/xml2vmxtest.c b/tests/xml2vmxtest.c index 439ddc8..70f28aa 100644 --- a/tests/xml2vmxtest.c +++ b/tests/xml2vmxtest.c @@ -274,6 +274,7 @@ mymain(void) DO_TEST("esx-in-the-wild-4", "esx-in-the-wild-4", 4); DO_TEST("esx-in-the-wild-5", "esx-in-the-wild-5", 4); DO_TEST("esx-in-the-wild-6", "esx-in-the-wild-6", 4); + DO_TEST("esx-in-the-wild-7", "esx-in-the-wild-7", 4); DO_TEST("gsx-in-the-wild-1", "gsx-in-the-wild-1", 4); DO_TEST("gsx-in-the-wild-2", "gsx-in-the-wild-2", 4); -- 1.7.4.1
-- libvir-list mailing list [email protected] https://www.redhat.com/mailman/listinfo/libvir-list
