[libvirt] [PATCHv4 3/4] VMX: Add support for 'auto detect' fileNames

Doug Goldstein cardoe at cardoe.com
Tue Sep 10 01:48:48 UTC 2013


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:
  <disk type='block' device='lun'>
    <source startupPolicy='optional'/>
    <target dev='hda' bus='ide'/>
    <address type='drive' controller='0' bus='0' target='0' unit='0'/>
  </disk>

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 40416a0..5c2c794 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 0000000..b2c4caf
--- /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 0000000..bce708d
--- /dev/null
+++ b/tests/vmx2xmldata/vmx2xml-cdrom-ide-raw-auto-detect.xml
@@ -0,0 +1,24 @@
+<domain type='vmware'>
+  <uuid>00000000-0000-0000-0000-000000000000</uuid>
+  <memory unit='KiB'>32768</memory>
+  <currentMemory unit='KiB'>32768</currentMemory>
+  <vcpu placement='static'>1</vcpu>
+  <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='block' device='lun'>
+      <source startupPolicy='optional'/>
+      <target dev='hda' bus='ide'/>
+      <address type='drive' controller='0' bus='0' target='0' unit='0'/>
+    </disk>
+    <controller type='ide' index='0'/>
+    <video>
+      <model type='vmvga' vram='4096'/>
+    </video>
+  </devices>
+</domain>
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 0000000..0209b29
--- /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 0000000..a81646a
--- /dev/null
+++ b/tests/vmx2xmldata/vmx2xml-cdrom-scsi-raw-auto-detect.xml
@@ -0,0 +1,24 @@
+<domain type='vmware'>
+  <uuid>00000000-0000-0000-0000-000000000000</uuid>
+  <memory unit='KiB'>32768</memory>
+  <currentMemory unit='KiB'>32768</currentMemory>
+  <vcpu placement='static'>1</vcpu>
+  <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='block' device='lun'>
+      <source startupPolicy='optional'/>
+      <target dev='sda' bus='scsi'/>
+      <address type='drive' controller='0' bus='0' target='0' unit='0'/>
+    </disk>
+    <controller type='scsi' index='0'/>
+    <video>
+      <model type='vmvga' vram='4096'/>
+    </video>
+  </devices>
+</domain>
diff --git a/tests/vmx2xmltest.c b/tests/vmx2xmltest.c
index 479c84c..5eb04e9 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 0000000..34e1467
--- /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 0000000..166410c
--- /dev/null
+++ b/tests/xml2vmxdata/xml2vmx-cdrom-ide-raw-auto-detect.xml
@@ -0,0 +1,14 @@
+<domain type='vmware'>
+  <name>cdrom-ide-device</name>
+  <uuid>564d9bef-acd9-b4e0-c8f0-aea8b9103515</uuid>
+  <memory unit='KiB'>4096</memory>
+  <os>
+    <type>hvm</type>
+  </os>
+  <devices>
+    <disk type='block' device='lun'>
+      <source startupPolicy='optional'/>
+      <target dev='hda' bus='ide'/>
+    </disk>
+  </devices>
+</domain>
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 0000000..84ec646
--- /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 0000000..6531ec8
--- /dev/null
+++ b/tests/xml2vmxdata/xml2vmx-cdrom-scsi-raw-auto-detect.xml
@@ -0,0 +1,14 @@
+<domain type='vmware'>
+  <name>cdrom-scsi-device</name>
+  <uuid>564d9bef-acd9-b4e0-c8f0-aea8b9103515</uuid>
+  <memory unit='KiB'>4096</memory>
+  <os>
+    <type>hvm</type>
+  </os>
+  <devices>
+    <disk type='block' device='lun'>
+      <source startupPolicy='optional'/>
+      <target dev='sda' bus='scsi'/>
+    </disk>
+  </devices>
+</domain>
diff --git a/tests/xml2vmxtest.c b/tests/xml2vmxtest.c
index cb1c29c..cafcc36 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);
-- 
1.8.1.5




More information about the libvir-list mailing list