From 834aebcc2fc935f54732220011a0b87b242ccf68 Mon Sep 17 00:00:00 2001 From: Doug Goldstein Date: Tue, 13 Aug 2013 10:56:01 -0500 Subject: [PATCH] VMX: Add support for 'auto detect' fileNames VMWare Fusion 5 can set the CD-ROM's device name to be 'auto detect' when using the physical drive via 'cdrom-raw' device type. VMWare will then connect to first available host CD-ROM to the virtual machine upon start up according to VMWare documentation. If no device is available, it appears that the device will remain disconnected. To better model this a CD-ROM that is marked as "auto detect" when in the off state would be modeled as the following with this patch:
Once the domain transitions to the powered on state, libvirt can populate the remaining source data with what is connected, if anything. However future power cycles, the domain may not always start with that device attached. --- src/vmx/vmx.c | 28 +++++++++++++++---- .../vmx2xml-cdrom-ide-raw-auto-detect.vmx | 5 ++++ .../vmx2xml-cdrom-ide-raw-auto-detect.xml | 24 ++++++++++++++++ .../vmx2xml-cdrom-scsi-raw-auto-detect.vmx | 6 ++++ .../vmx2xml-cdrom-scsi-raw-auto-detect.xml | 24 ++++++++++++++++ tests/vmx2xmltest.c | 2 ++ .../xml2vmx-cdrom-ide-raw-auto-detect.vmx | 14 ++++++++++ .../xml2vmx-cdrom-ide-raw-auto-detect.xml | 14 ++++++++++ .../xml2vmx-cdrom-scsi-raw-auto-detect.vmx | 15 ++++++++++ .../xml2vmx-cdrom-scsi-raw-auto-detect.xml | 14 ++++++++++ tests/xml2vmxtest.c | 2 ++ 11 files changed, 143 insertions(+), 5 deletions(-) create mode 100644 tests/vmx2xmldata/vmx2xml-cdrom-ide-raw-auto-detect.vmx create mode 100644 tests/vmx2xmldata/vmx2xml-cdrom-ide-raw-auto-detect.xml create mode 100644 tests/vmx2xmldata/vmx2xml-cdrom-scsi-raw-auto-detect.vmx create mode 100644 tests/vmx2xmldata/vmx2xml-cdrom-scsi-raw-auto-detect.xml create mode 100644 tests/xml2vmxdata/xml2vmx-cdrom-ide-raw-auto-detect.vmx create mode 100644 tests/xml2vmxdata/xml2vmx-cdrom-ide-raw-auto-detect.xml create mode 100644 tests/xml2vmxdata/xml2vmx-cdrom-scsi-raw-auto-detect.vmx create mode 100644 tests/xml2vmxdata/xml2vmx-cdrom-scsi-raw-auto-detect.xml diff --git a/src/vmx/vmx.c b/src/vmx/vmx.c index 40416a0f88..5c2c79430f 100644 --- a/src/vmx/vmx.c +++ b/src/vmx/vmx.c @@ -2221,14 +2221,26 @@ virVMXParseDisk(virVMXContext *ctx, virDomainXMLOptionPtr xmlopt, virConfPtr con goto ignore; } else if (STRCASEEQ(deviceType, "atapi-cdrom")) { (*def)->type = VIR_DOMAIN_DISK_TYPE_BLOCK; - (*def)->src = fileName; - fileName = NULL; + + if (STRCASEEQ(fileName, "auto detect")) { + (*def)->src = NULL; + (*def)->startupPolicy = VIR_DOMAIN_STARTUP_POLICY_OPTIONAL; + } else { + (*def)->src = fileName; + fileName = NULL; + } } else if (STRCASEEQ(deviceType, "cdrom-raw")) { /* Raw access CD-ROMs actually are device='lun' */ (*def)->device = VIR_DOMAIN_DISK_DEVICE_LUN; (*def)->type = VIR_DOMAIN_DISK_TYPE_BLOCK; - (*def)->src = fileName; - fileName = NULL; + + if (STRCASEEQ(fileName, "auto detect")) { + (*def)->src = NULL; + (*def)->startupPolicy = VIR_DOMAIN_STARTUP_POLICY_OPTIONAL; + } else { + (*def)->src = fileName; + fileName = NULL; + } } else { virReportError(VIR_ERR_INTERNAL_ERROR, _("Invalid or not yet handled value '%s' " @@ -3473,7 +3485,13 @@ virVMXFormatDisk(virVMXContext *ctx, virDomainDiskDefPtr def, VIR_FREE(fileName); } else if (def->type == VIR_DOMAIN_DISK_TYPE_BLOCK) { - if (def->src != NULL) { + if (!def->src && + def->startupPolicy == VIR_DOMAIN_STARTUP_POLICY_OPTIONAL) { + virBufferAsprintf(buffer, "%s%d:%d.autodetect = \"true\"\n", + busType, controllerOrBus, unit); + virBufferAsprintf(buffer, "%s%d:%d.fileName = \"auto detect\"\n", + busType, controllerOrBus, unit); + } else { virBufferAsprintf(buffer, "%s%d:%d.fileName = \"%s\"\n", busType, controllerOrBus, unit, def->src); } diff --git a/tests/vmx2xmldata/vmx2xml-cdrom-ide-raw-auto-detect.vmx b/tests/vmx2xmldata/vmx2xml-cdrom-ide-raw-auto-detect.vmx new file mode 100644 index 0000000000..b2c4caf20f --- /dev/null +++ b/tests/vmx2xmldata/vmx2xml-cdrom-ide-raw-auto-detect.vmx @@ -0,0 +1,5 @@ +config.version = "8" +virtualHW.version = "4" +ide0:0.present = "true" +ide0:0.deviceType = "cdrom-raw" +ide0:0.fileName = "auto detect" diff --git a/tests/vmx2xmldata/vmx2xml-cdrom-ide-raw-auto-detect.xml b/tests/vmx2xmldata/vmx2xml-cdrom-ide-raw-auto-detect.xml new file mode 100644 index 0000000000..bce708d1f7 --- /dev/null +++ b/tests/vmx2xmldata/vmx2xml-cdrom-ide-raw-auto-detect.xml @@ -0,0 +1,24 @@ + + 00000000-0000-0000-0000-000000000000 + 32768 + 32768 + 1 + + hvm + + + destroy + restart + destroy + + + + +
+ + + + + diff --git a/tests/vmx2xmldata/vmx2xml-cdrom-scsi-raw-auto-detect.vmx b/tests/vmx2xmldata/vmx2xml-cdrom-scsi-raw-auto-detect.vmx new file mode 100644 index 0000000000..0209b291e6 --- /dev/null +++ b/tests/vmx2xmldata/vmx2xml-cdrom-scsi-raw-auto-detect.vmx @@ -0,0 +1,6 @@ +config.version = "8" +virtualHW.version = "4" +scsi0.present = "true" +scsi0:0.present = "true" +scsi0:0.deviceType = "cdrom-raw" +scsi0:0.fileName = "auto detect" diff --git a/tests/vmx2xmldata/vmx2xml-cdrom-scsi-raw-auto-detect.xml b/tests/vmx2xmldata/vmx2xml-cdrom-scsi-raw-auto-detect.xml new file mode 100644 index 0000000000..a81646a28e --- /dev/null +++ b/tests/vmx2xmldata/vmx2xml-cdrom-scsi-raw-auto-detect.xml @@ -0,0 +1,24 @@ + + 00000000-0000-0000-0000-000000000000 + 32768 + 32768 + 1 + + hvm + + + destroy + restart + destroy + + + + +
+ + + + + diff --git a/tests/vmx2xmltest.c b/tests/vmx2xmltest.c index 479c84c14c..5eb04e9ea4 100644 --- a/tests/vmx2xmltest.c +++ b/tests/vmx2xmltest.c @@ -238,9 +238,11 @@ mymain(void) DO_TEST("cdrom-scsi-file", "cdrom-scsi-file"); DO_TEST("cdrom-scsi-device", "cdrom-scsi-device"); DO_TEST("cdrom-scsi-raw-device", "cdrom-scsi-raw-device"); + DO_TEST("cdrom-scsi-raw-auto-detect", "cdrom-scsi-raw-auto-detect"); DO_TEST("cdrom-ide-file", "cdrom-ide-file"); DO_TEST("cdrom-ide-device", "cdrom-ide-device"); DO_TEST("cdrom-ide-raw-device", "cdrom-ide-raw-device"); + DO_TEST("cdrom-ide-raw-auto-detect", "cdrom-ide-raw-auto-detect"); DO_TEST("floppy-file", "floppy-file"); DO_TEST("floppy-device", "floppy-device"); diff --git a/tests/xml2vmxdata/xml2vmx-cdrom-ide-raw-auto-detect.vmx b/tests/xml2vmxdata/xml2vmx-cdrom-ide-raw-auto-detect.vmx new file mode 100644 index 0000000000..34e1467e1f --- /dev/null +++ b/tests/xml2vmxdata/xml2vmx-cdrom-ide-raw-auto-detect.vmx @@ -0,0 +1,14 @@ +.encoding = "UTF-8" +config.version = "8" +virtualHW.version = "4" +guestOS = "other" +uuid.bios = "56 4d 9b ef ac d9 b4 e0-c8 f0 ae a8 b9 10 35 15" +displayName = "cdrom-ide-device" +memsize = "4" +numvcpus = "1" +ide0:0.present = "true" +ide0:0.deviceType = "cdrom-raw" +ide0:0.autodetect = "true" +ide0:0.fileName = "auto detect" +floppy0.present = "false" +floppy1.present = "false" diff --git a/tests/xml2vmxdata/xml2vmx-cdrom-ide-raw-auto-detect.xml b/tests/xml2vmxdata/xml2vmx-cdrom-ide-raw-auto-detect.xml new file mode 100644 index 0000000000..166410c09e --- /dev/null +++ b/tests/xml2vmxdata/xml2vmx-cdrom-ide-raw-auto-detect.xml @@ -0,0 +1,14 @@ + + cdrom-ide-device + 564d9bef-acd9-b4e0-c8f0-aea8b9103515 + 4096 + + hvm + + + + + + + + diff --git a/tests/xml2vmxdata/xml2vmx-cdrom-scsi-raw-auto-detect.vmx b/tests/xml2vmxdata/xml2vmx-cdrom-scsi-raw-auto-detect.vmx new file mode 100644 index 0000000000..84ec646cef --- /dev/null +++ b/tests/xml2vmxdata/xml2vmx-cdrom-scsi-raw-auto-detect.vmx @@ -0,0 +1,15 @@ +.encoding = "UTF-8" +config.version = "8" +virtualHW.version = "4" +guestOS = "other" +uuid.bios = "56 4d 9b ef ac d9 b4 e0-c8 f0 ae a8 b9 10 35 15" +displayName = "cdrom-scsi-device" +memsize = "4" +numvcpus = "1" +scsi0.present = "true" +scsi0:0.present = "true" +scsi0:0.deviceType = "cdrom-raw" +scsi0:0.autodetect = "true" +scsi0:0.fileName = "auto detect" +floppy0.present = "false" +floppy1.present = "false" diff --git a/tests/xml2vmxdata/xml2vmx-cdrom-scsi-raw-auto-detect.xml b/tests/xml2vmxdata/xml2vmx-cdrom-scsi-raw-auto-detect.xml new file mode 100644 index 0000000000..6531ec8ba1 --- /dev/null +++ b/tests/xml2vmxdata/xml2vmx-cdrom-scsi-raw-auto-detect.xml @@ -0,0 +1,14 @@ + + cdrom-scsi-device + 564d9bef-acd9-b4e0-c8f0-aea8b9103515 + 4096 + + hvm + + + + + + + + diff --git a/tests/xml2vmxtest.c b/tests/xml2vmxtest.c index cb1c29c46d..cafcc368ff 100644 --- a/tests/xml2vmxtest.c +++ b/tests/xml2vmxtest.c @@ -254,9 +254,11 @@ mymain(void) DO_TEST("cdrom-scsi-file", "cdrom-scsi-file", 4); DO_TEST("cdrom-scsi-device", "cdrom-scsi-device", 4); DO_TEST("cdrom-scsi-raw-device", "cdrom-scsi-raw-device", 4); + DO_TEST("cdrom-scsi-raw-auto-detect", "cdrom-scsi-raw-auto-detect", 4); DO_TEST("cdrom-ide-file", "cdrom-ide-file", 4); DO_TEST("cdrom-ide-device", "cdrom-ide-device", 4); DO_TEST("cdrom-ide-raw-device", "cdrom-ide-raw-device", 4); + DO_TEST("cdrom-ide-raw-auto-detect", "cdrom-ide-raw-auto-detect", 4); DO_TEST("floppy-file", "floppy-file", 4); DO_TEST("floppy-device", "floppy-device", 4);