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:
  <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.
This commit is contained in:
Doug Goldstein 2013-08-13 10:56:01 -05:00
parent 4b5652d0dc
commit 834aebcc2f
11 changed files with 143 additions and 5 deletions

View File

@ -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;
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;
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);
}

View File

@ -0,0 +1,5 @@
config.version = "8"
virtualHW.version = "4"
ide0:0.present = "true"
ide0:0.deviceType = "cdrom-raw"
ide0:0.fileName = "auto detect"

View File

@ -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>

View File

@ -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"

View File

@ -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>

View File

@ -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");

View File

@ -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"

View File

@ -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>

View File

@ -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"

View File

@ -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>

View File

@ -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);